package com.zj.leetcode.medium.stack;

import java.util.Stack;

/**
 * @program: algorithm
 * @description: 简化路径
 * 71 simplify-path
 * 给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
 * <p>
 * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
 * <p>
 * 请注意，返回的 规范路径 必须遵循下述格式：
 * <p>
 * 始终以斜杠 '/' 开头。
 * 两个目录名之间必须只有一个斜杠 '/' 。
 * 最后一个目录名（如果存在）不能 以 '/' 结尾。
 * 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
 * 返回简化后得到的 规范路径 。
 * @author: Zhang Bo
 * @create: 2022-01-14 17:05
 **/
public class SimplifyPath {
    public static void main(String[] args) {
        String path = "/home/";
//        String path = "/../";
//        String path = "/home//foo/";
//        String path = "/a/./b/../../c/";
//        String path = "/a//b////c/d//././/..";
        Solution solution = new SimplifyPath().new Solution();
        System.out.println(solution.simplifyPath(path));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String simplifyPath(String path) {
            Stack<String> stack = new Stack<String>();

            int i = 0;
            int j = 0;
            int size = path.length();
            while (j <= size) {

                if ('/' == path.charAt(i)) {
                    i++;
                    j = Math.max(i, j);
                } else {
                    if (j == size || '/' == path.charAt(j)) {
                        String sub = path.substring(i, j);
                        if ("..".equals(sub)) {
                            if (!stack.empty()) {
                                stack.pop();
                            }
                        } else if (!".".equals(sub)) {
                            stack.push(sub);
                        }
                        i = j;
                    }
                }


                j++;
            }
            StringBuilder ret = new StringBuilder();
            for (String var : stack) {
                ret.append("/").append(var);
            }
            return "".equals(ret.toString()) ? "/" : ret.toString();
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
